#include <iostream>

#if 0
    // 如果子类继承了父类，子类会和父类会共用父类的静态变量
    class Base
    {
    public:
        static int GetNum()
        {
            return a;
        }

        static void add()
        {
            a++;
        }
    protected:
        // 静态变量，不属于对象，由本类完全共享，因为内存在静态区
        // 那如果子类继承你，会不会把你的静态变量给继承过来呢？
        static int a;
    };

    int Base::a = 0;

    class Derived:public Base
    {
    public:
        static int GetNum()
        {
            return a;
        }
    };

    int main()
    {
        Derived d;
        Base::add();
        std::cout<<d.GetNum()<<std::endl;
        d.add();
        std::cout<<Base::GetNum()<<std::endl;
        return 0;
    }
#endif

#if 1
    // 子类自己也定义一个static
    class Base
    {
    public:
        static int GetNum()
        {
            return a;
        }

        static void add()
        {
            a++;
        }
    protected:
        // 静态变量，不属于对象，由本类完全共享，因为内存在静态区
        static int a;
    };

    int Base::a = 0;

    class Derived:public Base
    {
    public:
        static int GetNum()
        {
            return a;
        }

        // 如果想改子类的a，那就自己定一个函数
        // static void add()
        // {
        //     a++;
        // }
    public:
        static int a;   // 自己有的就调自己的，父类的名词被遮蔽
    };

    int Derived::a = 10;

    int main()
    {
        Derived d;
        Base::add();
        std::cout<<d.GetNum()<<std::endl;
        // 调谁的函数就对谁的静态变量产生影响
        d.add(); // 子类调用父类的函数，这个函数作用于父类的a，不会影响子类的a
        // 如果想改子类的a，那就自己再定一个函数
        std::cout<<Base::GetNum()<<std::endl;
        std::cout<<d.GetNum()<<std::endl;
        return 0;
    }
#endif